import java.util.ArrayList;

/**
 * Represente un systeme d'equation
 * @author Lydie Nguyen
 *
 */
public class System_equation {

	ArrayList<Equation> S;
	
	/**
	 * Construit un system d'equation
	 * @param S liste d'equations
	 */
	public System_equation(ArrayList<Equation> S)
	{
		this.S=S;
	}
	
	
	/**
	 * Affiche par poids croissants les solutions d'un systeme d'equation
	 */
	public void resoudre(int max)
	{

		MultiEnsemble multi=new MultiEnsemble();
		Matrice m=null;
		

		//construction des ensembles avec oppose
		UFind u=new UFind(max);
		for(Equation e:S)
		{
			if(e.i==true)
			{
				System.out.println("Je suis avec a"+e.a+" + a"+e.b+" = 1");
				u.unionOppose(e.a,e.b);
				for(int j=0;j<max;j++)
					System.out.printf("%2d ",u.ens_sommet[j]);
				System.out.println();
				for(int j=0;j<max;j++)
					System.out.printf("%2d ",u.ens_oppose[j]);
				System.out.println();
				
			}
			else
			{
				System.out.println("Je suis avec a"+e.a+" + a"+e.b+" = 0");
				u.union(e.a, e.b);
				for(int j=0;j<max;j++)
					System.out.printf("%2d ",u.ens_sommet[j]);
				System.out.println();
				for(int j=0;j<max;j++)
					System.out.printf("%2d ",u.ens_oppose[j]);
				System.out.println();
			}
		}
		
		for(int j=0;j<max;j++)
			System.out.printf("%2d ",u.ens_sommet[j]);
		System.out.println();
		for(int j=0;j<max;j++)
			System.out.printf("%2d ",u.ens_oppose[j]);
		System.out.println();
		
		ArrayList<Integer> list =u.oppose();
		Matrice matrice=new Matrice(new MultiEnsemble(list),u);
		System.out.println("j'utilise la premier partie");
		matrice.remplir_matrice();
		matrice.affiche();
		matrice.Enumeration2();
		
		
		
	}
	
	/***********INUTILE*****************/
	/**
	 * Dis si tab est une solution du systeme d'equation S. 
	 * @param tab tableau binaire qui represente un nombre binaire
	 * @return true si tab est une solution du systeme d'equation, false sinon
	 */
	public boolean verifie_propriete(int[] tab)
	{
		for(Equation e:S)
		{
			if(e.i==true)//si a+b=1   -->   (a=0 et b=1)  ou   (a=1 et b=0)  ---> a!=b
			{
				if(tab[(e.a)-1]==tab[(e.b)-1])
					return false;
			}
			else //si a+b=0  --> a=b
			{
				if(tab[(e.a)-1]!=tab[(e.b)-1])
					return false;
			}
		}
		return true;
	}
	
}
